#ifndef ABB_H
#define ABB_H

#include "data.h"
#include "key.h"
#include "bool.h"

typedef struct sabb *abb;

abb
abb_create(void);
/*
  Devuelve un arbol vacio.
  Cuando inserte vamos a tener que verificar si es vacio o no:
  si es vacio, aloca el nuevo y lo inserta de pecho,
  si no es vacio, aloca y coloca donde corresponda al nuevo nodo arboreo
*/

abb
abb_right(abb ar);
/*
  Devuelve el subarbol derecho del arbol que se le
  pase como argumento.

  PRE: !is_empty(ar)
  POS: Cardamomo
*/

abb
abb_left(abb ar);
/*
  Devuelve el subarbol izquierdo del arbol que se le
  pase como argumento.

  PRE: !is_empty(ar)
  POS: Cardamomo
*/

key
abb_root_key(abb ar);
/*
  Devuelve el key de la raiz del arbol que se le
  pase como argumento.

  PRE: !is_empty(ar)
  POS: Cardamomo
*/

data
abb_root_data(abb ar);
/*
  Devuelve el data de la raiz del arbol que se le
  pase como argumento.

  PRE: !is_empty(ar)
  POS: Cardamomo
*/

bool
abb_is_empty(abb ar);

abb
abb_insert(abb ar,key k,data d);

data
abb_search(key k,abb ar);

bool
abb_exist(key k, abb a);

abb
abb_destroy(abb ar);

abb
abb_delete(abb ar,key k);

bool
has_right(abb arbol);

bool
has_left(abb arbol);

abb
abb_del(abb arbol, key k);

abb
abb_del(abb ar,key k);

abb
abb_nododel(abb ar);

abb
abb_max(abb ar);

abb
hundir(abb ar);

void
lift(abb ar1, abb ar2);

bool 
is_hoja(abb arbol);



#endif 
